package utils

import (
	"MulticloudManagement/internal/model"
	"github.com/golang-jwt/jwt/v5"
	"time"
)

// Claims 定义Claims结构体
type Claims struct {
	User model.User
	jwt.RegisteredClaims
}

// GenerateJWT 生成token(传递登录用户信息)
func GenerateJWT(user model.User, secret string) (string, error) {
	now := time.Now()
	// 实例化Claims对象
	claims := Claims{
		User: user,
		RegisteredClaims: jwt.RegisteredClaims{
			Issuer:    "dyz",
			ExpiresAt: jwt.NewNumericDate(now.Add(time.Hour * 24)),
			IssuedAt:  jwt.NewNumericDate(now),
		},
	}
	// 使用sha256生成token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 结合密钥 生成token
	return token.SignedString([]byte(secret))
}

// ParseJWT 解析token
func ParseJWT(token string, secret string) (*Claims, error) {
	// 定义一个结构体变量,保存解析后的token信息
	claims := &Claims{}
	result, err := jwt.ParseWithClaims(token, claims, func(token *jwt.Token) (interface{}, error) {
		return []byte(secret), nil
	})
	if err != nil {
		// 如果解析失败,返回错误信息
		return nil, err
	}
	// 如果token无效
	// 主要验证签名(密钥验证),过期(当前时间是否超于),发行时间(当前时间是否早于)
	if !result.Valid {
		return nil, err
	}

	return claims, nil
}
